#include <stdio.h>
#include <string.h>
#include <openssl/evp.h>

int main() {
    // 初始化数据
    const char *data = "Hello, OpenSSL SM3!";
    unsigned char hash[EVP_MAX_MD_SIZE]; // SM3 输出大小为 32 字节
    unsigned int hash_len;

    // 创建 EVP MD 上下文
    EVP_MD_CTX *mdctx = EVP_MD_CTX_new();
    if (mdctx == NULL) {
        fprintf(stderr, "Error creating context.\n");
        return 1;
    }

    // 初始化 SM3 摘要操作
    if (EVP_DigestInit_ex(mdctx, EVP_sm3(), NULL) != 1) {
        fprintf(stderr, "Error initializing SM3.\n");
        EVP_MD_CTX_free(mdctx);
        return 1;
    }

    // 提供要计算哈希的数据
    if (EVP_DigestUpdate(mdctx, data, strlen(data)) != 1) {
        fprintf(stderr, "Error updating SM3 digest.\n");
        EVP_MD_CTX_free(mdctx);
        return 1;
    }

    // 完成哈希计算
    if (EVP_DigestFinal_ex(mdctx, hash, &hash_len) != 1) {
        fprintf(stderr, "Error finalizing SM3 digest.\n");
        EVP_MD_CTX_free(mdctx);
        return 1;
    }

    // 清理上下文
    EVP_MD_CTX_free(mdctx);

    // 打印计算出的哈希
    printf("SM3 hash: ");
    for (unsigned int i = 0; i < hash_len; i++) {
        printf("%02x", hash[i]);
    }
    printf("\n");

    return 0;
}
